import defaultSetting from './config.js'
import { common_extend } from './utils/util'
import Store from './store'
import { locales } from './locale/locale'
import server from './controllers/server'
import luckysheetConfigsetting from './controllers/luckysheetConfigsetting'
import sheetmanage from './controllers/sheetmanage'
import luckysheetHandler from './controllers/handler'
import { initialFilterHandler } from './controllers/filter'
import { initialMatrixOperation } from './controllers/matrixOperation'
import { initialSheetBar } from './controllers/sheetBar'
import { formulaBarInitial } from './controllers/formulaBar'
import { rowColumnOperationInitial } from './controllers/rowColumnOperation'
import { keyboardInitial } from './controllers/keyboard'
import { orderByInitial } from './controllers/orderBy'
import { initPlugins } from './controllers/expendPlugins'
import { closeLoading } from './controllers/menuButton'
import {
  getluckysheetfile,
  getluckysheet_select_save,
  getconfig,
} from './methods/get'
import { setluckysheet_select_save } from './methods/set'
import { luckysheetrefreshgrid, jfrefreshgrid } from './global/refresh'
import functionlist from './function/functionlist'
import { luckysheetlodingHTML } from './controllers/constant'
import { getcellvalue, getdatabyselection } from './global/getdata'
import { setcellvalue, setDbMark } from './global/setdata'
import { selectHightlightShow } from './controllers/select'
import { zoomInitial } from './controllers/zoom'
import { printInitial } from './controllers/print'
import { dictInitial } from './controllers/dictRender'
import './controllers/cellTree'
import './controllers/cellDict'
import './controllers/cellDialogList'
import method from './global/method'
import * as api from './global/api'
import { setDictData } from './global/dictRenderData'
import flatpickr from 'flatpickr'
import Mandarin from 'flatpickr/dist/l10n/zh.js'
import { initListener, domDestroyed } from './controllers/listener'
import { hideloading, showloading } from './global/loading.js'
import { luckysheetextendData } from './global/extend.js'

let luckysheet = {}

// mount api
// window.luckysheet.api = api;
// Object.assign(luckysheet, api);

luckysheet = common_extend(api, luckysheet)

//创建luckysheet表格
luckysheet.create = function (setting) {
  method.destroy()
  // Store original parameters for api: toJson
  Store.toJsonOptions = {}
  for (let c in setting) {
    if (c !== 'data') {
      Store.toJsonOptions[c] = setting[c]
    }
  }
  if (!setting.compType) setting.compType = 'filling'
  let extendsetting = common_extend(defaultSetting[setting.compType], setting)
  let loadurl = extendsetting.loadUrl,
    menu = extendsetting.menu,
    title = extendsetting.title

  let container = extendsetting.container
  Store.id = extendsetting.id
  Store.compType = extendsetting.compType
  Store.useCase = extendsetting.useCase || 'page'
  Store.container = container
  Store.luckysheetfile = extendsetting.data
  Store.defaultcolumnNum = extendsetting.column
  Store.defaultrowNum = extendsetting.row
  Store.defaultFontSize = extendsetting.defaultFontSize
  Store.fullscreenmode = extendsetting.fullscreenmode
  Store.lang = extendsetting.lang //language
  Store.allowEdit = extendsetting.allowEdit
  Store.limitSheetNameLength = extendsetting.limitSheetNameLength
  Store.defaultSheetNameMaxLength = extendsetting.defaultSheetNameMaxLength
  Store.requestHeader = extendsetting.requestHeader
  Store.dbMark = extendsetting.data[0]?.dbMark
  Store.FailCell = []
  Store.FailCellLocation = []
  Store.delDataIds = []
  server.gridKey = extendsetting.gridKey
  server.loadUrl = extendsetting.loadUrl
  server.updateUrl = extendsetting.updateUrl
  server.updateImageUrl = extendsetting.updateImageUrl
  server.title = extendsetting.title
  server.loadSheetUrl = extendsetting.loadSheetUrl
  server.allowUpdate = extendsetting.allowUpdate

  luckysheetConfigsetting.autoFormatw = extendsetting.autoFormatw
  luckysheetConfigsetting.accuracy = extendsetting.accuracy
  luckysheetConfigsetting.total = extendsetting.data[0].total

  luckysheetConfigsetting.loading = extendsetting.loading
  luckysheetConfigsetting.allowCopy = extendsetting.allowCopy
  luckysheetConfigsetting.showtoolbar = extendsetting.showtoolbar
  luckysheetConfigsetting.showtoolbarConfig = extendsetting.showtoolbarConfig
  luckysheetConfigsetting.showinfobar = extendsetting.showinfobar
  luckysheetConfigsetting.showsheetbar = extendsetting.showsheetbar
  luckysheetConfigsetting.showsheetbarConfig = extendsetting.showsheetbarConfig
  luckysheetConfigsetting.showstatisticBar = extendsetting.showstatisticBar
  luckysheetConfigsetting.showstatisticBarConfig =
    extendsetting.showstatisticBarConfig
  luckysheetConfigsetting.sheetFormulaBar = extendsetting.sheetFormulaBar
  luckysheetConfigsetting.cellRightClickConfig =
    extendsetting.cellRightClickConfig
  luckysheetConfigsetting.sheetRightClickConfig =
    extendsetting.sheetRightClickConfig
  luckysheetConfigsetting.pointEdit = extendsetting.pointEdit
  luckysheetConfigsetting.pointEditUpdate = extendsetting.pointEditUpdate
  luckysheetConfigsetting.pointEditZoom = extendsetting.pointEditZoom

  luckysheetConfigsetting.userInfo = extendsetting.userInfo
  luckysheetConfigsetting.userMenuItem = extendsetting.userMenuItem
  luckysheetConfigsetting.myFolderUrl = extendsetting.myFolderUrl
  luckysheetConfigsetting.functionButton = extendsetting.functionButton

  luckysheetConfigsetting.showConfigWindowResize =
    extendsetting.showConfigWindowResize
  luckysheetConfigsetting.enableAddRow = extendsetting.enableAddRow
  luckysheetConfigsetting.enableAddBackTop = extendsetting.enableAddBackTop
  luckysheetConfigsetting.addRowCount = extendsetting.addRowCount
  luckysheetConfigsetting.enablePage = extendsetting.enablePage
  luckysheetConfigsetting.pageInfo = extendsetting.pageInfo

  luckysheetConfigsetting.editMode = extendsetting.editMode
  luckysheetConfigsetting.beforeCreateDom = extendsetting.beforeCreateDom
  luckysheetConfigsetting.workbookCreateBefore =
    extendsetting.workbookCreateBefore
  luckysheetConfigsetting.workbookCreateAfter =
    extendsetting.workbookCreateAfter
  luckysheetConfigsetting.remoteFunction = extendsetting.remoteFunction

  luckysheetConfigsetting.fireMousedown = extendsetting.fireMousedown
  luckysheetConfigsetting.forceCalculation = extendsetting.forceCalculation
  luckysheetConfigsetting.plugins = extendsetting.plugins

  luckysheetConfigsetting.rowHeaderWidth = extendsetting.rowHeaderWidth
  luckysheetConfigsetting.columnHeaderHeight = extendsetting.columnHeaderHeight

  luckysheetConfigsetting.defaultColWidth = extendsetting.defaultColWidth
  luckysheetConfigsetting.defaultRowHeight = extendsetting.defaultRowHeight

  luckysheetConfigsetting.title = extendsetting.title
  luckysheetConfigsetting.container = extendsetting.container
  luckysheetConfigsetting.hook = extendsetting.hook

  luckysheetConfigsetting.pager = extendsetting.pager

  luckysheetConfigsetting.initShowsheetbarConfig = false

  luckysheetConfigsetting.imageUpdateMethodConfig =
    extendsetting.imageUpdateMethodConfig

  if (Store.lang === 'zh') flatpickr.localize(Mandarin.zh)

  // Store the currently used plugins for monitoring asynchronous loading
  Store.asyncLoad.push(...luckysheetConfigsetting.plugins)
  // Register plugins
  initPlugins(extendsetting.plugins, extendsetting.data, Store.useCase)
  if (setting.compType === 'filling' && extendsetting.data[0].dictCodesData) {
    Object.keys(extendsetting.data[0].dictCodesData).forEach((item) => {
      setDictData(item, extendsetting.data[0].dictCodesData[item])
    })
  }
  // Store formula information, including internationalization
  functionlist()

  let devicePixelRatio = extendsetting.devicePixelRatio
  if (devicePixelRatio == null) {
    devicePixelRatio = 1
  }
  Store.devicePixelRatio = Math.ceil(devicePixelRatio)

  // //loading
  const loadingObj = luckysheetlodingHTML('#' + container)
  Store.loadingObj = loadingObj

  if (loadurl == '') {
    sheetmanage.initialjfFile(menu, title)
    // luckysheetsizeauto();
    initialWorkBook()
  } else {
    $.post(loadurl, { gridKey: server.gridKey }, function (d) {
      let data = new Function('return ' + d)()
      Store.luckysheetfile = data

      sheetmanage.initialjfFile(menu, title)
      // luckysheetsizeauto();
      initialWorkBook()

      //需要更新数据给后台时，建立WebSocket连接
      if (server.allowUpdate) {
        server.openWebSocket()
      }
    })
  }
}

function initialWorkBook() {
  luckysheetHandler() //Overall dom initialization
  initialFilterHandler() //Filter initialization
  initialMatrixOperation() //Right click matrix initialization
  initialSheetBar() //bottom sheet bar initialization
  formulaBarInitial() //top formula bar initialization
  rowColumnOperationInitial() //row and coloumn operate initialization
  keyboardInitial() //Keyboard operate initialization
  orderByInitial() //menu bar orderby function initialization
  zoomInitial() //zoom method initialization
  printInitial() //print initialization
  initListener()
  dictInitial()
}

//获取所有表格数据
luckysheet.getluckysheetfile = getluckysheetfile

//获取当前表格 选区
luckysheet.getluckysheet_select_save = getluckysheet_select_save

//设置当前表格 选区
luckysheet.setluckysheet_select_save = setluckysheet_select_save

//获取当前表格 config配置
luckysheet.getconfig = getconfig

//二维数组数据 转化成 {r, c, v}格式 一维数组 (传入参数为二维数据data)
luckysheet.getGridData = sheetmanage.getGridData

//生成表格所需二维数组 （传入参数为表格数据对象file）
luckysheet.buildGridData = sheetmanage.buildGridData

// Refresh the canvas display data according to scrollHeight and scrollWidth
luckysheet.luckysheetrefreshgrid = luckysheetrefreshgrid

// Refresh canvas
luckysheet.jfrefreshgrid = jfrefreshgrid

// Get the value of the cell
luckysheet.getcellvalue = getcellvalue

// Set cell value
luckysheet.setcellvalue = setcellvalue

// set DB mark config
luckysheet.setDbMark = setDbMark

// Get selection range value
luckysheet.getdatabyselection = getdatabyselection

luckysheet.sheetmanage = sheetmanage
luckysheet.domDestroyed = domDestroyed
luckysheet.closeLoading = closeLoading

// Data of the current table
luckysheet.flowdata = function () {
  return Store.flowdata
}

// Set selection highlight
luckysheet.selectHightlightShow = selectHightlightShow

// Reset parameters after destroying the table
luckysheet.destroy = method.destroy

luckysheet.showLoadingProgress = showloading
luckysheet.hideLoadingProgress = hideloading
luckysheet.luckysheetextendData = luckysheetextendData

luckysheet.locales = locales

export { luckysheet }
